package com.fintech.third.service;

import java.io.UnsupportedEncodingException;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONObject;
import com.fintech.common.service.BaseServiceImpl;
import com.fintech.third.model.EdcDataQueryLog;
import com.fintech.third.model.ThirdEffectDTO;
import com.fintech.third.model.interfacedata.EdcDataCallOperationRecordsDto;
import com.fintech.third.model.interfacedata.EdcProductInterfaceEffecttimeConfigDto;
import com.marvels.common.utils.MarvelsLogUtil;

@Service("baseServiceUtil")
public class BaseServiceUtilImpl extends BaseServiceImpl implements BaseServiceUtil {

	/**
	 * 日志
	 * 
	 * @param serialNum
	 * @param code
	 * @param msg
	 * @param reqBody
	 * @param respBody
	 * @param channel
	 * @param method
	 * @param sTime
	 * @param eTime
	 * @param swiftNumber
	 *            百融请求编号
	 */
	@Override
	public void saveLog(String serialNum, String code, String msg, String reqBody, String respBody, String channel,
			String method, Date sTime, Date eTime, String swiftNumber, String custIdNumber) {
		super.saveLog(serialNum, code, msg, reqBody, respBody, channel, method, sTime, eTime, swiftNumber,
				custIdNumber);
	}

	@Override
	public void saveErrorLog(String serialNum, String code, String msg, String reqBody, String respBody, String channel,
			String method, Date sTime, Date eTime) {
		super.saveErrorLog(serialNum, code, msg, reqBody, respBody, channel, method, sTime, eTime);
	}

	@Override
	public void saveCallCountLog(String loanId, String interfaceCode, String result, String thirdProductCode,
			String interfaceDescription) {
		super.saveCallCountLog(loanId, interfaceCode, result, thirdProductCode, interfaceDescription);
	}

	/**
	 * 插入第三方数据调用记录
	 * 
	 * @param edcDataCallOperationRecordsDto
	 */
	@Override
	public void saveEdcDataCallOperationRecords(EdcDataCallOperationRecordsDto edcDataCallOperationRecordsDto) {
		super.saveEdcDataCallOperationRecords(edcDataCallOperationRecordsDto);
	}

	/**
	 * 插入时效性中间表
	 * 
	 * @param effectDto
	 */
	@Override
	public void saveEdcDataCallOperationRecords(ThirdEffectDTO effectDto) {
		super.saveEdcDataCallOperationRecords(effectDto);
	}

	/**
	 * 查询时效性中间表（按接口编码、身份证或者手机号维度区分）<BR>
	 * PS：如果添加产品大类维度，则数据重用性变低，因此取消了产品大类<BR>
	 * 
	 * @param effectDto
	 * @return
	 */
	@Override
	public EdcDataCallOperationRecordsDto selectEdcDataCallOperationRecordSig(ThirdEffectDTO effectDto) {
		return super.selectEdcDataCallOperationRecordSig(effectDto);
	}

	/**
	 * 获取时间有效性配置信息（按接口编码和产品大类维度区分）
	 * 
	 * @param effectDto
	 * @return
	 */
	@Override
	public EdcProductInterfaceEffecttimeConfigDto selectEdcProInterfaceTimeConfigSig(ThirdEffectDTO effectDto) {
		return super.selectEdcProInterfaceTimeConfigSig(effectDto);
	}

	/**
	 * 查询智盒子配置的临时时间有效性
	 * 
	 * @return
	 */
	@Override
	public int getLgdbEffectTime() {
		return super.getLgdbEffectTime();
	}

	/**
	 * 插入第三方数据调用日志（不同第三方不同表）
	 * 
	 * @param reqNo
	 *            请求唯一编码
	 * @param loanId
	 *            贷款编号
	 * @param mobile
	 *            手机号码
	 * @param requestDate
	 *            请求时间
	 * @param interfaceCode
	 *            接口编码
	 * @param responseCode
	 *            第三方返回状态
	 * @param status
	 *            1：查询成功有数据返回 0：查询成功无数据返回 -1：第三方返回的异常状态 -99：落库失败 -9：请求失败
	 * @param tableName
	 *            表名
	 * @param custIdCard
	 *            身份证
	 */
	@Override
	public void saveDataQueryLogNew(String reqNo, String loanId, String mobile, Date requestDate, String interfaceCode,
			String responseCode, String status, String tableName, String custIdCard) {
		super.saveDataQueryLogNew(reqNo, loanId, mobile, requestDate, interfaceCode, responseCode, status, tableName,
				custIdCard);
	}

	/**
	 * 插入第三方数据调用日志（不同第三方不同表）
	 * 
	 * @param reqNo
	 *            请求唯一编码
	 * @param loanId
	 *            贷款编号
	 * @param mobile
	 *            手机号码
	 * @param swiftNumber
	 *            百融查询批次标识
	 * @param requestDate
	 *            请求时间
	 * @param responseDate
	 *            响应时间
	 * @param interfaceCode
	 *            接口编码
	 * @param responseCode
	 *            第三方返回状态
	 * @param status
	 *            1：查询成功有数据返回 0：查询成功无数据返回 -1：第三方返回的异常状态 -99：落库失败 -9：请求失败
	 * @param custIdCard
	 *            身份证
	 */
	@Override
	public void saveDataQueryLogNew(String reqNo, String loanId, String mobile, String swiftNumber, Date requestDate,
			String interfaceCode, String responseCode, String status, String tableName, String custIdCard) {
		super.saveDataQueryLogNew(reqNo, loanId, mobile, swiftNumber, requestDate, interfaceCode, responseCode, status,
				tableName, custIdCard);
	}

	/**
	 * 插入第三方数据调用日志(不同第三方不同表)
	 * 
	 * @param reqNo
	 *            流水唯一批次号
	 * @param loanId
	 *            进件单号
	 * @param mobile
	 *            手机号
	 * @param swiftNumber
	 *            百融查询批次标识
	 * @param requestDate
	 *            请求时间
	 * @param responseDate
	 *            响应时间
	 * @param interfaceCode
	 *            接口代码
	 * @param responseCode
	 *            第三方响应code
	 * @param status
	 *            1：查询成功有数据返回 0：查询成功无数据返回 -1：第三方返回的异常状态 -99：落库失败 -9：请求失败
	 * @param tableName
	 *            表名
	 */
	@Override
	public void saveDataQueryLog(String reqNo, String loanId, String mobile, String swiftNumber, Date requestDate,
			Date responseDate, String interfaceCode, String responseCode, String status, String tableName,
			String createdBy) {
		super.saveDataQueryLog(reqNo, loanId, mobile, swiftNumber, requestDate, responseDate, interfaceCode,
				responseCode, status, tableName, createdBy);
	}

	/**
	 * 更新第三方数据调用日志(不同第三方不同表)
	 * 
	 * @param reqNo
	 *            流水唯一批次号
	 * @param loanId
	 *            进件单号
	 * @param mobile
	 *            手机号
	 * @param swiftNumber
	 *            百融查询批次标识
	 * @param requestDate
	 *            请求时间
	 * @param responseDate
	 *            响应时间
	 * @param interfaceCode
	 *            接口代码
	 * @param responseCode
	 *            第三方响应code
	 * @param status
	 *            1：查询成功有数据返回 0：查询成功无数据返回 -1：第三方返回的异常状态 -99：落库失败 -9：请求失败
	 * @param tableName
	 *            表名
	 * @param id
	 */
	@Override
	public void updateDataQueryLog(String reqNo, String loanId, String mobile, String swiftNumber, Date requestDate,
			Date responseDate, String interfaceCode, String responseCode, String status, String tableName,
			String createdBy, Integer id) {
		super.updateDataQueryLog(reqNo, loanId, mobile, swiftNumber, requestDate, responseDate, interfaceCode,
				responseCode, status, tableName, createdBy, id);
	}

	/**
	 * 查询第三方数据调用日志(不同第三方不同表)
	 * 
	 * @param reqNo
	 *            流水唯一批次号
	 * @param tableName
	 *            表名
	 */
	@Override
	public EdcDataQueryLog QueryDataQueryLog(String reqNo, String tableName) {
		return super.QueryDataQueryLog(reqNo, tableName);
	}

	@Override
	public String getString(JSONObject json, String key) {
		return super.getString(json, key);
	}

	/**
	 * 按字节截取字符串长度
	 * 
	 * @param source
	 *            源字符串
	 * @param len
	 *            长度限制
	 * @return
	 */
	public static String subStr(String source, int len) {
		return subStr(source, "UTF-8", len);
	}

	/**
	 * 按字节截取字符串长度
	 * 
	 * @param source
	 *            源字符串
	 * @param charSet
	 *            字符集编码
	 * @param len
	 *            长度限制
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static String subStr(String source, String charSet, int len) {
		if (StringUtils.isEmpty(source)) {
			return "";
		}
		try {
			byte[] byteArr = source.getBytes(charSet); // 字节数组
			int charLen = byteArr.length; // 字符串字节长度

			// 字节长度小于设定值
			if (charLen <= len) {
				return source;
			}
			int count = 0;
			// 统计要截取的那部分字节中负数的个数
			for (int i = 0; i < len; i++) {
				if (byteArr[i] < 0) {
					count++;
				}
			}
			// 负数成对出现 则不会出现半个汉字
			int surplus = count % ("UTF-8".equalsIgnoreCase(charSet) ? 3 : 2);
			return new String(byteArr, 0, len - surplus, charSet);
		} catch (Exception e) {
			MarvelsLogUtil.getInstance().error("截取字符串异常，原样输出。source=" + source, e);
			// 保持原样输出
			return source;
		}
	}

	/**
	 * 第三方数据查询时效性判断公共方法（兼容旧方法）
	 * 
	 * @param loanId
	 *            贷款编号
	 * @param interfaceCode
	 *            接口编码
	 * @return effectFlag：<BR>
	 *         0：未配置时间有效性或者配置时间为0、<BR>
	 *         1：ISUSE为0，接口停用<BR>
	 *         2：正常配置时间有效性，但是在时效性范围内无数据，需重新查询<BR>
	 *         3：时效性范围内有数据，无需重新查询<BR>
	 */
	@Override
	public ThirdEffectDTO checkEffectInfo(String loanId, String interfaceCode) {
		return super.checkEffectInfo(loanId, interfaceCode);
	}

	/**
	 * 第三方数据查询时效性判断公共方法
	 * 
	 * @param effectDto
	 *            时效性DTO
	 * @return effectFlag：<BR>
	 *         0：未配置时间有效性或者配置时间为0、<BR>
	 *         1：ISUSE为0，接口停用<BR>
	 *         2：正常配置时间有效性，但是在时效性范围内无数据，需重新查询<BR>
	 *         3：时效性范围内有数据，无需重新查询<BR>
	 * @throws Exception
	 */
	@Override
	public ThirdEffectDTO checkEffectInfo(ThirdEffectDTO effectDto) {
		return super.checkEffectInfo(effectDto);
	}
}
